///|
/// 将字符串重复指定次数。
///
/// 参数：
///
/// * `s`：要重复的字符串。
/// * `n`：重复的次数。
///
/// 返回将字符串重复 `n` 次后拼接的结果。
///
/// 示例：
///
/// ```moonbit
/// inspect(@lib.repeat("hello", 3), content="hellohellohello")
/// inspect(@lib.repeat("x", 0), content="")
/// inspect(@lib.repeat("abc", 1), content="abc")
/// ```
///
pub fn repeat(s : String, n : Int) -> String {
  let mut res = ""
  for i = 0; i < n; i = i + 1 {
    res = res + s
  }
  res
}

///|
/// 使用指定的填充字符串从左侧填充字符串，直到达到目标长度。
///
/// 参数：
///
/// * `s` : 要被填充的原始字符串。
/// * `length` : 结果字符串的目标长度。
/// * `pad_str` : 用于填充的字符串。
///
/// 返回从左侧填充到指定长度的新字符串，如果原字符串已经达到或超过目标长度则返回原字符串。
///
/// 示例：
///
/// ```moonbit
/// inspect(@lib.left_pad("hello", 10, "0"), content="00000hello")
/// inspect(@lib.left_pad("world", 8, "ab"), content="abaworld")
/// inspect(@lib.left_pad("test", 3, "x"), content="test")
/// inspect(@lib.left_pad("", 5, "*"), content="*****")
/// ```
///
pub fn left_pad(s : String, length : Int, pad_str : String) -> String {
  if s.length() >= length {
    return s
  }
  let pad_len = length - s.length()
  let repeat_times = (pad_len + pad_str.length() - 1) / pad_str.length()
  let padding = repeat(pad_str, repeat_times).substring(start=0, end=pad_len)
  padding + s
}

///|
/// 使用指定的填充字符串从右侧填充字符串，直到达到目标长度。
///
/// 参数：
///
/// * `s` : 要被填充的原始字符串。
/// * `length` : 结果字符串的目标长度。
/// * `pad_str` : 用于填充的字符串。
///
/// 返回从右侧填充到指定长度的新字符串，如果原字符串已经达到或超过目标长度则返回原字符串。
///
/// 示例：
///
/// ```moonbit
/// inspect(@lib.right_pad("hello", 10, "0"), content="hello00000")
/// inspect(@lib.right_pad("world", 8, "ab"), content="worldaba")
/// inspect(@lib.right_pad("test", 3, "x"), content="test")
/// inspect(@lib.right_pad("", 5, "*"), content="*****")
/// ```
///
pub fn right_pad(s : String, length : Int, pad_str : String) -> String {
  if s.length() >= length {
    return s
  }
  let pad_len = length - s.length()
  let repeat_times = (pad_len + pad_str.length() - 1) / pad_str.length()
  let padding = repeat(pad_str, repeat_times).substring(start=0, end=pad_len)
  s + padding
} 

///|
/// 使用指定的填充字符串从左右两侧填充字符串，直到达到目标长度。
///
/// 参数：
///
/// * `s` : 要被填充的原始字符串。
/// * `length` : 结果字符串的目标长度。
/// * `pad_str` : 用于在两侧填充的字符串。
///
/// 返回从两侧填充到指定长度的新字符串，如果原字符串已经达到或超过目标长度则返回原字符串。
///
/// 示例：
///
/// ```moonbit
/// inspect(@lib.left_and_right_pad("hello", 11, "0"), content="000hello000")
/// inspect(@lib.left_and_right_pad("world", 9, "ab"), content="abworldab")
/// inspect(@lib.left_and_right_pad("test", 8, "xy"), content="xytestxy")
/// inspect(@lib.left_and_right_pad("center", 3, "*"), content="center")
/// inspect(@lib.left_and_right_pad("", 6, "-"), content="------")
/// ```
///
pub fn left_and_right_pad(s: String, length: Int, pad_str: String) -> String {
  if s.length() >= length {
    return s
  }
  let pad_len = length - s.length()
  let left_pad_len = pad_len / 2
  let right_pad_len = pad_len - left_pad_len

  let repeat_times = (length + pad_str.length() - 1) / pad_str.length()
  let padding = repeat(pad_str, repeat_times)

  let left_padding = padding.substring(start=0, end=left_pad_len)
  let right_padding = padding.substring(start=0, end=right_pad_len)

  left_padding + s + right_padding
}
